
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  
#include <stdbool.h> 

#define MAX_SIZE 10 // 定义队列的最大容量

//环形队列
typedef struct 
{
    int *data; //数据
    int front; //列头 
    int rear; //列尾
    int size; //当前队列中的元素数量, int * 指向的数组大小不确定， 需用size明确大小
} CircularQueue;


//初始化队列
void initQueue(CircularQueue *q){

    q -> data = (int *)malloc(sizeof(int) * MAX_SIZE);
    q -> front  = 0;
    q -> rear = 0;
    q -> size = 0;
}

//销毁队列
void destoryQueue(CircularQueue *q){

    free(q -> data);
    q -> front = q -> rear = q -> size = 0; //复合赋值语句
}

//判断队列是否为空
bool isEmpty(CircularQueue *q){
    return q -> size == 0; //== 不要写成了 =
}

// 判断队列是否已满
bool isFull(CircularQueue *q){
    return q -> size == MAX_SIZE; //== 不要写成了 =
}

//入队操作
bool enqueue(CircularQueue *q, int value){

    //队列已满
    if (isFull(q))
    {
        return false;
    }

    q -> data[q->rear] = value; //放入队尾
    q -> rear = (q->rear+1) % MAX_SIZE; //更新队尾指针
    q -> size++;
    return true;
}

//出队操作
bool dequeue(CircularQueue *q, int *value){

    //队列为空
    if (isEmpty(q))
    {
        return false;
    }

    *value = q -> data[q->front]; //取出前面的元素
    q -> front = (q -> front +1) % MAX_SIZE; //更新队头指针
    q -> size--;
    return true;
}

int main(void){

    CircularQueue q;
    initQueue(&q); //初始化环形队列

    //入队
    for (int i = 0; i < 10; i++)
    {
        enqueue(&q, i+1);
        printf("enqueue: ele: %d  size: %d \n", i+1, q.size);
    }
    
    printf("\n");

    int value;
    while (dequeue(&q, &value)) //出对
    {
        printf("dequeue: ele: %d  size: %d \n", value, q.size);
    }


    destoryQueue(&q); //销毁队列

    return 0;
}